home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 26.zip / BS1 part 26 / Aztec C v5.2a disk 2.adf / reslib52.lzh / libsup.c < prev    next >
C/C++ Source or Header  |  1990-09-30  |  3KB  |  126 lines

  1. /* mylib.c    -- exec library routines for mylib     */
  2.  
  3. #include <exec/lists.h>
  4. #include <exec/resident.h>
  5. #include <functions.h>
  6. #include "mylib.h"
  7.  
  8. void myInit(void);
  9. long myOpen(void);
  10. long myClose(int);
  11. long myExpunge(void);
  12.  
  13. #pragma amicall(mylibBase, 0x06, myOpen())
  14. #pragma amicall(mylibBase, 0x0c, myClose(d3))
  15. #pragma amicall(mylibBase, 0x12, myExpunge())
  16.  
  17. /* library initialization table, used for AUTOINIT libraries            */
  18. struct InitTable {
  19.     unsigned long    it_DataSize;          /* library data space size        */
  20.     void            **it_FuncTable;          /* table of entry points            */
  21.     void             *it_DataInit;          /* table of data initializers        */
  22.     void            (*it_InitFunc)(void); /* initialization function to run    */
  23. };
  24.  
  25. void *libfunctab[] = {    /* my function table */
  26.     myOpen,                    /* standard open    */
  27.     myClose,                /* standard close    */
  28.     myExpunge,                /* standard expunge    */
  29.     0,
  30.  
  31.     /* ------    user UTILITIES */
  32.     Func1,                    /* user defined function 1 */
  33.     Func2,                    /* user defined function 2 */
  34.  
  35.     (void *)-1                /* end of function vector table */
  36. };
  37.  
  38. struct InitTable myInitTab =  {
  39.     sizeof (struct mylibBase),
  40.     libfunctab,
  41.     0,                        /* will initialize my data in funkymain()    */
  42.     myInit
  43. };
  44.  
  45. #define MYREVISION    4        /* would be nice to auto-increment this        */
  46.  
  47. char myname[] = "mylib.library";
  48. char myid[] = "MYLIB 0.4 (17 Oct 1989)\r\n";
  49.  
  50. extern struct Resident    myRomTag;
  51.  
  52. long
  53. _main(struct mylibBase *mylibBase, unsigned long seglist)
  54. {
  55.     mylibBase->ml_SegList = seglist;
  56.  
  57.     /* ----- init. library structure  -----        */
  58.     mylibBase->ml_Lib.lib_Node.ln_Type = NT_LIBRARY;
  59.     mylibBase->ml_Lib.lib_Node.ln_Name = (char *) myname;    
  60.     mylibBase->ml_Lib.lib_Flags = LIBF_SUMUSED | LIBF_CHANGED;
  61.     mylibBase->ml_Lib.lib_Version = myRomTag.rt_Version;
  62.     mylibBase->ml_Lib.lib_Revision = MYREVISION;
  63.     mylibBase->ml_Lib.lib_IdString = (APTR) myid;
  64. }
  65.  
  66. long
  67. myOpen(void)
  68. {
  69.     struct mylibBase *mylibBase;
  70.  
  71.     /* mark us as having another customer                    */
  72.     mylibBase->ml_Lib.lib_OpenCnt++;
  73.  
  74.     /* prevent delayed expunges (standard procedure)        */
  75.     mylibBase->ml_Lib.lib_Flags &= ~LIBF_DELEXP;
  76.  
  77.     return ((long) mylibBase);
  78. }
  79.  
  80. long
  81. myClose(int foo)
  82. {
  83.     struct mylibBase *mylibBase;
  84.     long retval = 0;
  85.  
  86.     if (--mylibBase->ml_Lib.lib_OpenCnt == 0) {
  87.  
  88.         if  (mylibBase->ml_Lib.lib_Flags & LIBF_DELEXP) {
  89.             /* no more people have me open,
  90.              * and I have a delayed expunge pending
  91.              */
  92.             retval = myExpunge(); /* return segment list    */
  93.         }
  94.     }
  95.  
  96.     return (retval);
  97. }
  98.  
  99. long
  100. myExpunge(void)
  101. {
  102.     struct mylibBase *mylibBase;
  103.     unsigned long seglist = 0;
  104.     long libsize;
  105.     extern struct Library *DOSBase;
  106.  
  107.     if (mylibBase->ml_Lib.lib_OpenCnt == 0) {
  108.         /* really expunge: remove libbase and freemem    */
  109.  
  110.         seglist    = mylibBase->ml_SegList;
  111.  
  112.         Remove(&mylibBase->ml_Lib.lib_Node);
  113.                                 /* i'm no longer an installed library    */
  114.  
  115.         libsize = mylibBase->ml_Lib.lib_NegSize+mylibBase->ml_Lib.lib_PosSize;
  116.         FreeMem((char *)mylibBase-mylibBase->ml_Lib.lib_NegSize, libsize);
  117.         CloseLibrary(DOSBase);        /* keep the counts even */
  118.     }
  119.     else
  120.         mylibBase->ml_Lib.lib_Flags |= LIBF_DELEXP;
  121.  
  122.     /* return NULL or real seglist                */
  123.     return ((long) seglist);
  124. }
  125.  
  126.